//user集合对应文档的CRUD操作的工具
const userModel = require("../models/user");
const bcrypt = require('bcrypt');
const {saltRounds,jwtcode} = require("../config/config")
const jwt = require("jsonwebtoken");
module.exports={
    //注册接口
    async register(ctx){
        //取出用户名&密码
        let {name,password} = ctx.request.body;

        //用户名 密码的检验(数据类型层面的检验)
        ctx.verifyParams({
            name:{type:'string'},
            password:{type:'string'}
        })

        //用户名不能重复(业务逻辑的校验)
        const users = await userModel.find({name});
        if(users.length >= 1) ctx.throw(409 , "当前用户名已经被使用")

        //密码加密
        const salt = bcrypt.genSaltSync(saltRounds);
        password = bcrypt.hashSync(password, salt);

        //往数据库中的user集合中插入一条新的文档
        const {_id} = await userModel.create({name,password});
        //重新查询一次是为了让返回的数据中不具有密码字段
        const res = await userModel.findById(_id)
        //返回注册成功的用户信息
        ctx.body = res
    },

    //登录接口
    async login(ctx){
        //取出用户名和密码
        let {name,password} = ctx.request.body;
        ctx.verifyParams({
            name:{type:'string'},
            password:{type:'string'}
        })
        //查看用户名是否存在
        const users = await userModel.find({name}).select("+password");
        if(users.length !== 1) ctx.throw(404 , "当前用户不存在")

        //如果用户名存在 则检验密码是否正确
        const user = users[0]
        const flag = bcrypt.compareSync(password,user.password)
        if(!flag) ctx.throw(403 , "密码错误")

        //返回一个token(包含登录成功的一些信息)
        const token = jwt.sign({id:user._id,name:user.name},jwtcode,{expiresIn:"7d"})
        ctx.body=token
    },

    //上传头像
    async avatar(ctx){
        //将头像上传到静态资源服务器中
        const file = ctx.request.files.file
        console.log(file.path)
        //pop代表删除数组最后一项 ; 返回值是删除的内容
        const name = file.path.split("\\").pop()
        //返回头像上传成功之后的地址!!
        ctx.body = `http://127.0.0.1:8888/img/${name}`
    },

    //查询所有用户(分页&模糊查询,当前的页码;每页显示多少条)
    async getAll(ctx){
        //pageNo:当前的页码
        //pageSize:每页显示多少条
        let {pageNo=1,pageSize=5,q=""} = ctx.query;
        Number.isNaN(+pageNo) ? pageNo=1 : "";
        Number.isNaN(+pageSize) ? pageSize=5 : "";

        pageNo = Math.max(+pageNo,1);
        pageSize = Math.max(+pageSize,1);
        const users = await userModel.find({name:new RegExp(q)}).skip((pageNo-1)*pageSize).limit(pageSize);
        ctx.body = users
    }
}